package forumcorba;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

import org.omg.CORBA.IntHolder;
import org.omg.CORBA.ORB;
import org.omg.CORBA.StringHolder;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;

import forumcorba.tpforum.Forum;
import forumcorba.tpforum.ForumHelper;
import forumcorba.tpforum.Message;
import forumcorba.tpforum.Reject;



/**
 * Applications reparties
 * TP
 * Forum simple en CORBA
 * 
 * Classe representant le client
 * 
 * Lancement :
 * java tp3corrige.ForumClient -ORBInitialPort 2000 -ORBInitialHost 127.0.0.1
 * 
 * @author Toto
 * @version 1.0
 */
public class ForumClient {

	public static final int POST = 1;
	public static final int GET = 2;
	public static final int REMOVE = 3;
	public static final int DISPLAY = 4;
	public static final int INFO = 5;

	/**
	 * Affichage du menu.
	 */
	public static void displayMenu() {
		System.out.println("\n****** Menu ******");
		System.out.println("Forum :");
		System.out.println(ForumClient.POST+" - Poster un message");
		System.out.println(ForumClient.GET+" - Recuperer un message");
		System.out.println(ForumClient.REMOVE+" - Supprimer un message");
		System.out.println(ForumClient.DISPLAY+" - Afficher tous les messages du forum");
		System.out.println(ForumClient.INFO+" - Informations sur le forum");
		System.out.println("quit - Quitter");
		System.out.print("> ");
	}

	/**
	 * Retourne le code de l'operation desire sur le forum.
	 * @param op Code operation (sous forme d'une String)
	 * @return int Code operation
	 * @throws NumberFormatException
	 */
	private static int getOperation(String op) throws NumberFormatException {
		int operation = -1;
		operation = Integer.parseInt(op);
		return operation;
	}

	/**
	 * Methode utilitaire de saisie du titre d'un message
	 * @param in Flux d'entree (clavier)
	 * @return String Le titre
	 * @throws IOException
	 */
	private static String getTitle(BufferedReader in) throws IOException {
		String title = null;
		System.out.print("Titre du message : ");
		title = in.readLine();
		return title;
	}

	/**
	 * Methode utilitaire de saisie de l'auteur d'un message
	 * @param in Flux d'entree (clavier)
	 * @return String L'auteur
	 * @throws IOException
	 */
	private static String getAuthor(BufferedReader in) throws IOException {
		String author = null;
		System.out.print("Auteur du message : ");
		author = in.readLine();
		return author;
	}

	/**
	 * Methode utilitaire de saisie de corps d'un message
	 * @param in Flux d'entree (clavier)
	 * @return String Le coprs
	 * @throws IOException
	 */
	private static String getBody(BufferedReader in) throws IOException {
		String body = "";
		String encours;
		System.out.print("Corps du message (tapez \"END.\" une fois termine): ");
		encours = in.readLine();
		while(!encours.equals("END.")) {
			body += "\n"+encours;
			encours = in.readLine();
		}
		return body;
	}

	/**
	 * Affichage d'un message 
	 * @param message L'objet Message a afficher.
	 */
	private static void display(Message message) {
		System.out.println("Date : " + message.date);
		System.out.println("Auteur : " + message.author);
		System.out.println("Titre : " + message.title);
		System.out.println("Corps : " + message.body);
	}

	/**
	 * Affichage d'un tableau de messages.
	 * @param mtab Le tableau d'objets Message.
	 */
	private static void display(Message[] mtab) {
		Message tmp;
		System.out.println("\nListes des messages :");
		for(int i=0; i<mtab.length; i++) {
			tmp = mtab[i];
			System.out.print("Date:\""+tmp.date+"\"");
			System.out.print(";Auteur:\""+tmp.author+"\"");
			System.out.print(";Titre:\""+tmp.title+"\"");
			System.out.print(";Message:\""+tmp.body+"\"");
			System.out.print("\n");
		}
	}

	/**
	 * Informations sur un forum.
	 * @param forum Le forum.
	 */
	private static void infos(Forum forum) {
		StringHolder themeHolder = new StringHolder();
		StringHolder moderatorHolder = new StringHolder();
		IntHolder sizeHolder = new IntHolder();
		forum.getInfo(themeHolder, moderatorHolder, sizeHolder);
		System.out.println("\nTheme : " + themeHolder.value);
		System.out.println("Moderateur : " + moderatorHolder.value);
		System.out.println("Nombre de messages : " + sizeHolder.value);
	}



	/**
	 * Programme principal du client
	 * @param args
	 */
	public static void main(String [] args) {

		try {

			//Initialisation de l'ORB
			ORB orb = ORB.init(args, null);

			//Recuperation de la reference de l'objet mandataire (proxy) du service de nommage 
			org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
			NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

			//Recuperation de la reference du servant grace au service de nommage 
			String name = "forum";
			Forum forum = ForumHelper.narrow(ncRef.resolve_str(name));
			
			//Invocation de methodes distantes
			//Programme du client
			BufferedReader userInput = null;
			String theLine = null;
			int operation;
			String titre, date, auteur, corps; 

			userInput = new BufferedReader(new InputStreamReader(System.in));
			
			while(true) {
				displayMenu();
				theLine = userInput.readLine();

				if(theLine.equals("quit")) { 
					System.out.println("Bye!"); 
					break;
				}

				try {
					operation = getOperation(theLine);

					switch(operation) {
					case ForumClient.POST : 
						auteur = getAuthor(userInput);
						titre = getTitle(userInput);
						corps = getBody(userInput);
						date = new Date().toString();
						forum.postMessage(new Message(titre, auteur, date, corps));
						break;
					case ForumClient.GET :
						titre = getTitle(userInput);
						display(forum.getMessage(titre));
						break;
					case ForumClient.REMOVE :
						titre = getTitle(userInput);
						forum.removeMessage(titre);
						break;
					case ForumClient.DISPLAY :
						display(forum.getMessages());
						break;
					case ForumClient.INFO :
						infos(forum);
						break;
					}
				}
				catch(NumberFormatException nfe) {
					System.err.println("Erreur : mauvais code operation\n"+nfe.getMessage());
					continue;
				}
				catch (Reject r) {
					System.err.println(r.message);
					continue;
				}
			}

		} 
		catch (InvalidName e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} 
		catch (NotFound e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} 
		catch (CannotProceed e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} 
		catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} 
		catch (IOException e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		}

	}

}



/*
Exemple d'execution :

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 1
Auteur du message : toto
Titre du message : corba1
Corps du message (tapez "END." une fois termine): salut.
c'est le tp d'applirepartie
END.

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 2
Titre du message : corba1
Date : Fri May 16 11:34:38 CEST 2008
Auteur : toto
Titre : corba1
Corps : salut.c'est le tp d'applirepartie

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 2
Titre du message : titi
GetMessage : message with title "titi" does not exist!

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 2
Titre du message : corba1
Date : Fri May 16 11:34:38 CEST 2008
Auteur : toto
Titre : corba1
Corps : salut.c'est le tp d'applirepartie

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 1
Auteur du message : titi
Titre du message : java
Corps du message (tapez "END." une fois termine): java, c'est bien !
END.

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 1
Auteur du message : truc
Titre du message : bd
Corps du message (tapez "END." une fois termine): les bases de donnees aussi !!!
END.

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 4

Listes des messages :
Date:"Fri May 16 11:36:37 CEST 2008";Auteur:"truc";Titre:"bd";Message:"les bases de donnees aussi !!!"
Date:"Fri May 16 11:36:14 CEST 2008";Auteur:"titi";Titre:"java";Message:"java, c'est bien !"
Date:"Fri May 16 11:34:38 CEST 2008";Auteur:"toto";Titre:"corba1";Message:"salut.c'est le tp d'applirepartie"

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 5

Theme : tp
Moderateur : toto
Nombre de messages : 3

****** Menu ******
Forum :
1 - Poster un message
22 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 3
Titre du message : truc
RemoveMessage : message "truc" does not exist!

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 3
Titre du message : java

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> 4

Listes des messages :
Date:"Fri May 16 11:36:37 CEST 2008";Auteur:"truc";Titre:"bd";Message:"les bases de donnees aussi !!!"
Date:"Fri May 16 11:34:38 CEST 2008";Auteur:"toto";Titre:"corba1";Message:"salut.c'est le tp d'applirepartie"

****** Menu ******
Forum :
1 - Poster un message
2 - Recuperer un message
3 - Supprimer un message
4 - Afficher tous les messages du forum
5 - Informations sur le forum
quit - Quitter
> quit
Bye!

*/
